/**
 * @file srt_sync.h
 * @author liuzl (zhanlin.liu@hopechart.com)
 * @brief 同步接口
 * @version 0.1
 * @date 2022-05-15
 * 
 * @copyright Copyright (c) Hangzhou Hopechart IoT {2009-2020}
 * 
 */
#ifndef __SRT_SYNC_H__
#define __SRT_SYNC_H__

#include "ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct Srt_TSynchrTag Srt_TSynchr;

/**
 * SRT变更同步通知回调函数
 */
typedef void (*TSrtDoPropChange)(void *sender, UInt32 param_id);
typedef void (*TSrtDoSynRestore)(void *sender, int level);
typedef void (*TSrtDoSynFlush)(void *sender);

struct Srt_TSynchrTag {
    void *object_;
    TSrtDoPropChange do_sync_;
    TSrtDoSynRestore do_restore_;
    TSrtDoSynFlush do_flush_;
};

/**
 * @brief 注册同步器
 * 
 * @note 支持多个同步器，应对多处理器架构
 * 
 * @param synchr 同步器对象
 * @return Int32 
 */
Int32 SrtSynchrRegister(Srt_TSynchr *synchr);

/**
 * @brief 同步组件专用设置函数
 * 
 * @param synchr 同步组件对象
 * @param param_id 参数ID
 * @param buffer 内容
 * @param len 内容长度
 * @return Int32 
 */
Int32 SrtSynchrDoSetValue(Srt_TSynchr *synchr, UInt32 param_id, const void *buffer, int len);

/**
 * @brief 同步组件专用查询函数
 * 
 * @note 如果未曾修改过(只有缺省值)则返回kHccMidSrtErrorFail
 * 
 * @param synchr 同步组件对象
 * @param param_id 参数ID
 * @param buffer 缓冲区
 * @param len 缓冲区长度
 * @return Int32 
 */
Int32 SrtSynchrDoGetValue(Srt_TSynchr *synchr, UInt32 param_id,       void *buffer, int len);

/**
 * @brief 同步组件专用Flush函数
 * 
 * @param synchr 同步组件对象
 * @return Int32 
 */
Int32 SrtSynchrDoFlush(Srt_TSynchr *synchr);

/**
 * @brief 同步组件专用Restore函数
 * 
 * @param synchr 同步组件对象
 * @param level 级别
 * @return Int32 
 */
Int32 SrtSynchrDoRestore(Srt_TSynchr *synchr, UInt8 level);

#ifdef __cplusplus
}
#endif

#endif//__SRT_SYNC_H__
